package com.lnt.java.thread.safe;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * <p>JAVA 在1.5之后加入了LOCK的重量锁</p>
 */
public class TicketSafeLockTest2 {

    Lock lock = new ReentrantLock();

    private String[] strArray = {"A", "B", "", "", ""};

    private int index = 2;

    public void addStrArray(String str) {
        // 手动加锁
        lock.lock();
        // 加锁之后的方法保持了代码的原子性
        if (index > 1) {
            strArray[index] = str;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            index ++;
            System.out.println(Thread.currentThread().getName() + "添加了" + str);
        }
        // 手动释放锁
        lock.unlock();
    }

    public void addStrArray2(String str) {
        // 手动加锁
        lock.lock();
        // 加锁之后的方法保持了代码的原子性
        // 在模拟业务代码的时候我们可能会有异常抛出，导致我们没有办法按照正常流程来解锁，这个时候就会导致死锁
        // 此时要求我们在执行lock锁的时候，需要考虑到异常的处理
        try {
            if (index > 1) {
                strArray[index] = str;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                index ++;
                System.out.println(Thread.currentThread().getName() + "添加了" + str);
            }
        } catch (Exception e) {
            System.out.println("代码发生了异常");
        }finally {
            // 手动释放锁
            lock.unlock();
        }
    }

    public String[] getStrArray() {
        return strArray;
    }
}
